package Modelo;

import Controlador.Controlador;
import GUI.InicioAplicacion;
import Modelo.ElementoPOI;
import Utils.Ficheros.FicheroDatos;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.Vector;
import javax.swing.DefaultListModel;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

/**
 *
 * @author Doria
 */
public class ListadoPOI {

    //Radio de deteccion
    private int RADIO_DETECCION = 1;
    //Nombre estandar para nuestro fichero de POIs personal
    private String ficheroPOI = "POI_Personales.csv";
    private String carpetaPOI;
    //Vector de archivos con POI disponibles
    private Vector<ElementoPOI> listaPOI;
    private Vector listaTipos;
    //Vector de POI personales
    private Vector poiPersonales;
    //Vector de POI en el radio de deteccion (tanto personales como en archivo)
    private Vector poiEnRadio = null;
    private Controlador controlador;

    public ListadoPOI() {
        controlador = InicioAplicacion.getControlador();
        //Comprobamos que tipos de POI se encuentran disponibles en una carpeta
        //determinada
        listaPOI = new Vector();
        listaTipos = new Vector();

        poiPersonales = new Vector();

        /*      carpetaPOI = dir;
        cargarArchivoRMS("personales");
        boolean[] settingsPOI = controlador.getFlagsPOI();
        String []e;
        File currDir;

        try {
        currDir = new File(getClass().getResource("/Archivos/Imagenes/Poi/").getPath() + carpetaPOI);
        if (!currDir.exists()) {
        currDir.createNewFile();
        }
        e = currDir.list();
        int j=0,i = 0;
        while (j<e.length) {
        String fileName = e[j];
        if (fileName.endsWith(".csv")) {
        if (settingsPOI[i]) {
        listaPOI.addElement(fileName);
        }
        i++;
        }
        }
        } catch (IOException ex) {
        ex.printStackTrace();
        }*/
    }

    public boolean addPOI(ElementoPOI poi) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (poi.getNombre().equals(elem.getNombre())) {
                encontrado = true;
            }
            i++;
        }
        if (!encontrado) {
            listaPOI.addElement(poi);
            return true;
        }
        return false;
    }
    /*
    public void addPOI(String nom, double lat, double lon, String desc, String tipo) {
    boolean encontrado = false;
    int i = 0;
    while (!encontrado && i < listaPOI.size()) {
    ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
    if (nom.equals(elem.getNombre())) {
    encontrado = true;
    }
    i++;
    }
    if (!encontrado) {
    ElementoPOI elemento = new ElementoPOI(nom, lat, lon, desc, tipo);
    listaPOI.addElement(elemento);
    }
    }*/

    public void removePOI(String nom) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (nom.equals(elem.getNombre())) {
                listaPOI.removeElementAt(i);
                encontrado = true;
            }
            i++;
        }
    }

    public void addTipo(String tipo) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaTipos.size()) {
            if (tipo.equals(listaTipos.get(i))) {
                encontrado = true;
            }
            i++;
        }
        if (!encontrado) {
            listaTipos.addElement(tipo);
        }

    }

    public void removeTipo(String tipo) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaTipos.size()) {
            if (tipo.equals(listaTipos.get(i))) {
                listaTipos.removeElementAt(i);
                encontrado = true;
            }
            i++;
        }
    }

    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    //
    public void borrarPOIpersonales(int contadorPOI) {
        poiPersonales.removeElementAt(contadorPOI);
    }

    public int getSizePOIpersonales() {
        return poiPersonales.size();
    }

    public void cargarPOI(DefaultListModel modelListPOI) throws FileNotFoundException {
        String nombreRuta = "";
        JFileChooser dialogCargar = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter(".csv", "csv");
        dialogCargar.setDialogTitle("Cargar POI");
        dialogCargar.setFileFilter(filter);
        int seleccion = dialogCargar.showOpenDialog(null);
        if (seleccion == dialogCargar.APPROVE_OPTION) {
            nombreRuta = dialogCargar.getSelectedFile().getPath();
        }
        FileInputStream inputStreamTxt = null;
        if (nombreRuta.compareTo("") != 0) {
            File rutaMapa = new File(nombreRuta);
            inputStreamTxt = new FileInputStream(rutaMapa);
            ElementoPOI elem = lecturaFichero(inputStreamTxt);
            //ElementoPOI elem = lecturaFicheroCSV(inputStreamTxt);
            while ((elem.getLatitud() != -1) && (elem.getLongitud() != -1)) {
                listaPOI.add(elem);
                modelListPOI.addElement(elem.getNombre());
                elem = lecturaFichero(inputStreamTxt);
                //elem = lecturaFicheroCSV(inputStreamTxt);
            }
            try {
                inputStreamTxt.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

    public ElementoPOI lecturaFichero(InputStream log) {
        String nombre = "";
        String descripcion = "";
        String tipo = "";
        double latitud = -1;
        double longitud = -1;

        try {
            StringBuffer buffer = new StringBuffer();
            int c = log.read();
            if (c != -1) {
                while (c != ',') {
                    char ch = (char) c;
                    buffer.append(ch);
                    c = log.read();
                }
                c = log.read();
                nombre = buffer.toString();
                buffer.delete(0, buffer.length());


                while (c != ',') {
                    char ch = (char) c;
                    buffer.append(ch);
                    c = log.read();
                }
                c = log.read();
                descripcion = buffer.toString();
                buffer.delete(0, buffer.length());

                while (c != ',') {
                    char ch = (char) c;
                    buffer.append(ch);
                    c = log.read();
                }
                c = log.read();
                tipo = buffer.toString();
                buffer.delete(0, buffer.length());

                while (c != ',') {
                    char ch = (char) c;
                    buffer.append(ch);
                    c = log.read();
                }
                c = log.read();
                latitud = Double.valueOf(buffer.toString()).doubleValue();
                buffer.delete(0, buffer.length());

                while (c != '\n') {
                    char ch = (char) c;
                    buffer.append(ch);
                    c = log.read();
                }
                longitud = Double.valueOf(buffer.toString()).doubleValue();
                buffer.delete(0, buffer.length());
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        int[] pixelXY = CalculosDatos.calcular(new FicheroDatos(latitud, longitud, 22));
        return (new ElementoPOI(nombre, descripcion, tipo, latitud, longitud, pixelXY[2], pixelXY[3]));
    }

    public ElementoPOI lecturaFicheroCSV(InputStream log) {
        String nombre = "NotFound";
        String descripcion = "";
        String tipo = "Otro";
        double latitud = -1;
        double longitud = -1;

        try {
            StringBuffer buffer = new StringBuffer();
            int c = log.read();
            if (c != -1) {
                while (c == ' ') {
                    c = log.read();
                }
                while (c != ',') {
                    char ch = (char) c;
                    buffer.append(ch);
                    c = log.read();
                }
                c = log.read();
                longitud = Double.valueOf(buffer.toString()).doubleValue();
                buffer.delete(0, buffer.length());
                while (c == ' ') {
                    c = log.read();
                }
                while (c != ',') {
                    char ch = (char) c;
                    buffer.append(ch);
                    c = log.read();
                }
                c = log.read();
                latitud = Double.valueOf(buffer.toString()).doubleValue();
                buffer.delete(0, buffer.length());
                while (c == ' ') {
                    c = log.read();
                }
                if (c == '"') {
                    c = log.read(); //para el "
                    while (c != '"') {
                        char ch = (char) c;
                        buffer.append(ch);
                        c = log.read();
                    }
                    c = log.read(); //para el /n
                    descripcion = buffer.toString();
                    buffer.delete(0, buffer.length());
                } else {
                    while (c != '\n') {
                        char ch = (char) c;
                        buffer.append(ch);
                        c = log.read();
                    }
                    descripcion = buffer.toString();
                    buffer.delete(0, buffer.length());
                }

            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        int[] pixelXY = CalculosDatos.calcular(new FicheroDatos(latitud, longitud, 22));
        return (new ElementoPOI(nombre, descripcion, tipo, latitud, longitud, pixelXY[2], pixelXY[3]));
    }

    public void guardarPOI() {
        try {
            JFileChooser dialogGuardar = new JFileChooser();
            FileNameExtensionFilter filter = new FileNameExtensionFilter("*.csv", "csv");
            dialogGuardar.setDialogTitle("Guardar POI");
            dialogGuardar.setFileFilter(filter);
            String nombreRuta = "";
            int seleccion = dialogGuardar.showSaveDialog(null);
            if (seleccion == dialogGuardar.APPROVE_OPTION) {
                nombreRuta = dialogGuardar.getSelectedFile().getPath();
            }

            File rutaGrabada = new File(nombreRuta + ".csv");
            rutaGrabada.createNewFile();
            FileOutputStream buffer = new FileOutputStream(rutaGrabada);
            String temp = "";
            for (int i = 0; i < listaPOI.size(); i++) {
                ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
                String nombre = elem.getNombre();
                String desc = elem.getDescripcion();
                String tipo = elem.getTipo();
                double latitud = elem.getLatitud();
                double longitud = elem.getLongitud();
                temp += nombre + "," +
                        desc + "," +
                        tipo + "," +
                        latitud + "," +
                        longitud + "\n";
                /*temp += latitud + ", " +
                        longitud + ", " + '"' +
                        desc + '"' + "\n";*/
            }

            buffer.write(temp.getBytes());
            buffer.flush();
            buffer.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Metodo que nos ayuda a determinar que POIs estan dentro de un radio 
     * determinado
     * @param latitud Posicion actual (Y)
     * @param longitud Posicion actual (X)
     *//*
    public Vector POIenRadio(double latitud, double longitud) {
    poiEnRadio = new Vector();
    int i = 0;
    File poi;
    FileInputStream fichero;
    while (listaPOI.size() > i) {
    try {
    //String nombre = (String) listaPOI.elementAt(i);
    String nombre = listaPOI.elementAt(i).getNombre();
    poi = new File(getClass().getResource("/Archivos/Imagenes/Poi/").getPath() + carpetaPOI + nombre);
    poi.createNewFile();
    fichero = new FileInputStream(poi);

    detectarPOIradio(nombre, latitud, longitud, fichero);
    fichero.close();
    i++;
    } catch (IOException ex) {
    ex.printStackTrace();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }
    //Incluimos en la estructura los POI personales tambien
    i = 0;
    while (poiPersonales.size() > i) {
    poiPersonalEnRadio((ElementoPOI) poiPersonales.elementAt(i), latitud, longitud);
    //poiEnRadio.addElement(poiPersonales.elementAt(i));
    i++;
    }
    return poiEnRadio;
    }*/

    public Vector POIpersonalesEnPantalla(
            double lat, double lon) {
        Vector personalEnPantalla = new Vector();
        int i = 0;
        while (poiPersonales.size() > i) {
            personalEnPantalla.addElement(poiPersonales.elementAt(i));
            i++;

        }










        return personalEnPantalla;
    }

    /*    public void guardarPOI(double lat, double lon, String desc, String tipo) {
    try {
    ElementoPOI elemento = new ElementoPOI(ficheroPOI, lat, lon, desc, tipo);
    poiPersonales.addElement(elemento);
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }*/
    private boolean borrarPOIpersonales(String nombre) {
        /*try {
        RecordStore rs = null;
        //Borramos la BD si tenía algo
        RecordStore.deleteRecordStore(nombre);
        rs = RecordStore.openRecordStore(nombre, true);
        rs.closeRecordStore();
        //Borramos el vector
        poiPersonales = new Vector();
        } catch (Exception ex) {
        controlador.muestraAlerta("Problema al guardar los poi personales");
        ex.printStackTrace();
        return false;
        }*/
        return true;
    }

    public boolean borrarPOIpersonales() {
        return borrarPOIpersonales("personales");
    }

    private boolean guardarArchivo(String nombre) {
        /* try {
        ElementoPOI elemento;
        RecordStore rs = null;
        //Borramos la BD si tenía algo
        RecordStore.deleteRecordStore(nombre);
        rs = RecordStore.openRecordStore(nombre, true);

        for (int i = 0; i < poiPersonales.size(); i++) {
        elemento = (ElementoPOI) poiPersonales.elementAt(i);
        Utils.RMS.guardaRegistro(rs, Double.toString(elemento.getLongitud()));
        Utils.RMS.guardaRegistro(rs, Double.toString(elemento.getLatitud()));
        }
        rs.closeRecordStore();
        } catch (Exception ex) {
        controlador.muestraAlerta("Problema al guardar los poi personales");
        ex.printStackTrace();
        return false;
        }*/
        return true;
    }

    private boolean cargarArchivoRMS(String nombre) {
        /* RecordStore rs = null;
        double x = 0, y = 0;
        String reg = "";
        ElementoPOI elemento;

        try {
        //Abrimos el recordStore
        //Si no existe, lo crea
        rs = RecordStore.openRecordStore(nombre, true);
        //Leemos los registros
        RecordEnumeration registros = rs.enumerateRecords(null, null, false);
        //Recorremos todos los elementos
        int total = registros.numRecords();
        int i = 0;
        while (registros.hasNextElement()) {
        //Obtenemos el ID del siguiente registro
        reg = Utils.RMS.verRegistro(rs, registros.nextRecordId());
        if (i % 2 == 0) { //Si estamos en la primera parte de la coordenada
        x = Double.parseDouble(reg);
        } else {
        y = Double.parseDouble(reg);
        elemento = new ElementoPOI(ficheroPOI, x, y, "POI Personal");
        //double[] elemento = {x,y};
        poiPersonales.addElement(elemento);
        }
        i++;
        }
        rs.closeRecordStore();
        } catch (Exception ex) {
        controlador.muestraAlerta("Problema al cargar los settings de un " + "fichero RMS");
        ex.printStackTrace();
        return false;
        }*/
        return true;
    }
    /*
    private void detectarPOIradio(String nombre, double latitud,
    double longitud, InputStream fichero) {
    ElementoPOI elemento;
    double latPOI = -1;
    double longPOI = -1;
    String descripcion = "";
    String tipo = "";
    int linea = 0;
    int contador = 0;
    try {
    StringBuffer buffer = new StringBuffer();
    int c = fichero.read();

    while (c != -1) //Mientras no es final de fichero
    {
    if ((linea == 0) || (linea == 1)) {
    while (c != '\n') {
    c = fichero.read();
    }
    } else {
    char ch = (char) c;
    if (ch == ',') {
    switch (contador) {
    case 0:
    longPOI = Double.valueOf(buffer.toString()).doubleValue();
    buffer.delete(0, buffer.length());

    contador++;

    break;
    case 1:
    latPOI = Double.valueOf(buffer.toString()).doubleValue();
    buffer.delete(0, buffer.length());

    contador++;

    break;
    default:
    break;
    }
    } else {
    if ((ch == '\n') && (contador == 2)) {
    descripcion = buffer.toString();
    buffer.delete(0, buffer.length());
    elemento = new ElementoPOI(nombre, latPOI, longPOI, descripcion, tipo);
    poiEnRadio.addElement(elemento);
    contador = 0;
    descripcion = "";
    } else {
    if ((ch != ' ') && (ch != '"') && (ch != '\n')) {
    buffer.append(ch);
    }
    }
    }
    }
    c = fichero.read();
    linea++;
    }
    if (contador == 2) {
    descripcion = buffer.toString();
    buffer.delete(0, buffer.length());
    elemento = new ElementoPOI(nombre, latPOI, longPOI, descripcion, tipo);
    poiEnRadio.addElement(elemento);
    }
    } catch (IOException ex) {
    ex.printStackTrace();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }*/

    public void setRadio(int radio) {
        RADIO_DETECCION = radio;
    }

    private void poiPersonalEnRadio(ElementoPOI elemento, double latitud, double longitud) {
        double lat = elemento.getLatitud();
        double lon = elemento.getLongitud();

        poiEnRadio.addElement(elemento);

    }

    /**
     * @return the listaPOI
     */
    public Vector getListaPOI() {
        return listaPOI;
    }

    public Vector getListaTipos() {
        return listaTipos;
    }

    public String dameDescripcion(
            String nombre) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (elem.getNombre().equals(nombre)) {
                return elem.getDescripcion();
            }

            i++;
        }

        return "";
    }

    public String dameTipo(
            String nombre) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (elem.getNombre().equals(nombre)) {
                return elem.getTipo();
            }

            i++;
        }

        return "";
    }
}
